#ifndef GPRS_STRUCT_H
#define GPRS_STRUCT_H

#include <QObject>

#define UPGRADE_FRAME_BYTE_NUM               499

// 远程升级文件定义
#define GPRS_UPGRADE_FILE_XNDACSRV            1    // 数据采集服务(bams/bin/xndacsrv)
#define GPRS_UPGRADE_FILE_XNVIEW              2    // GUI展示进程(bams/bin/xnview)
#define GPRS_UPGRADE_FILE_XNPROCSRV           3    // 数据处理服务(bams/bin/xnprocsrv)
#define GPRS_UPGRADE_FILE_XNTRANSRV           4    // 数据转发服务(bams/bin/xntransrv)
#define GPRS_UPGRADE_FILE_INI_XNTRANSRV       5    // 数据转发配置(bams/ini/transrv.ini)
#define GPRS_UPGRADE_FILE_INI_XNPROCSRV       6    // 数据处理配置(bams/ini/xnprocsrv.ini)

// 数据传输和命令定义
#define GPRS_DATA_STACK                      1    // 电池堆数据
#define GPRS_DATA_BA_COM_INPUT_REG           2    // BA 100 通用输入寄存器
#define GPRS_DATA_BANK_ALARM                 10   // 电池组告警信息
#define GPRS_DATA_BANK_SGL_VOL1              11   // 单体电压   1 - 100
#define GPRS_DATA_BANK_SGL_VOL2              12   // 单体电压 101 - 200
#define GPRS_DATA_BANK_SGL_VOL3              13   // 单体电压 201 - 300
#define GPRS_DATA_BANK_SGL_VOL4              14   // 单体电压 301 - 400
#define GPRS_DATA_BANK_SGL_TEMP1             15   // 单体温度   1 - 100
#define GPRS_DATA_BANK_SGL_TEMP2             16   // 单体温度 101 - 200
#define GPRS_DATA_BANK_SGL_TEMP3             17   // 单体温度 201 - 300
#define GPRS_DATA_BANK_SGL_TEMP4             18   // 单体温度 301 - 400
#define GPRS_DATA_BANK_SGL_SOC1              19   // 单体Soc   1 - 100
#define GPRS_DATA_BANK_SGL_SOC2              20   // 单体Soc 101 - 200
#define GPRS_DATA_BANK_SGL_SOC3              21   // 单体Soc 201 - 300
#define GPRS_DATA_BANK_SGL_SOC4              22   // 单体Soc 301 - 400
#define GPRS_DATA_BANK_SGL_RES1              23   // 单体内阻   1 - 100
#define GPRS_DATA_BANK_SGL_RES2              24   // 单体内阻 101 - 200
#define GPRS_DATA_BANK_SGL_RES3              25   // 单体内阻 201 - 300
#define GPRS_DATA_BANK_SGL_RES4              26   // 单体内阻 301 - 400
#define GPRS_DATA_BANK_SGL_SOH1              27   // 单体Soh   1 - 100
#define GPRS_DATA_BANK_SGL_SOH2              28   // 单体Soh 101 - 200
#define GPRS_DATA_BANK_SGL_SOH3              29   // 单体Soh 201 - 300
#define GPRS_DATA_BANK_SGL_SOH4              30   // 单体Soh 301 - 400
#define GPRS_DATA_BANK_OTHER                 31   // 其他电池组数据

#define GPRS_DATA_WARN_PARAM                 50   // 读取预警参数
#define GPRS_DATA_ALARM_PARAM                51   // 读取告警参数
#define GPRS_DATA_PROT_PARAM                 52   // 读取保护参数

#define GPRS_DATA_BANK_FULFILL               99   // 完成

#define GPRS_CMD_UPGRADE                     100   // 远程升级
#define GPRS_CMD_REBOOT                      101   // 远程重启
#define GPRS_CMD_LAST_VERSION                102   // 回退到上一版本
#define GPRS_CMD_SET_WARN_PARAM              103   // 设置预警参数
#define GPRS_CMD_SET_ALARM_PARAM             104   // 设置告警参数
#define GPRS_CMD_SET_PROT_PARAM              105   // 设置保护参数

//////////////////////////////////////////////////////////////////////////
// 结构定义 需要一字节对齐 处理
#ifdef XNWIN
#pragma pack(push)      //保存对齐状态
#pragma pack(1)         //设定为1字节对齐

#define LINUX_PACK_1_BYTE  
#else
#define LINUX_PACK_1_BYTE   __attribute__((packed))
#endif

// 心跳包 注册包
typedef struct _SHeartbeat
{
	quint16 usAreaCode;       // 地区编码(电话区号)   
	quint8  uStationNo;       // 储能站号
	quint8  uTransmitNo;      // 转发编号	
}LINUX_PACK_1_BYTE SHeartbeat;

// GPRS 消息头定义
typedef struct _SGPRSHead
{
	quint8  uCmdType;         // 命令类型(1Byte)  
	quint8  uModbusAddrBg;    // 后台Modbus地址(1Byte)	 
	quint16 usDataLen;        // 数据长度(2Byte)	      文件传输最后一帧长度
}LINUX_PACK_1_BYTE SGPRSHead;

typedef struct _SUpgradeHead
{
	quint8  uFile;            // 远程升级文件
	quint16 usFrameNum;       // 文件总帧数  
	quint16 usFrameIndex;     // 文件总帧序号	
	quint16 usFrameLen;       // 帧数据长度
}LINUX_PACK_1_BYTE SUpgradeHead;

typedef struct _SNetBattStack 
{
	quint16 usStackState;            // 电池堆状态            1   
	quint16 usBranParalState1;       // 第1支路并联状态      18  
	quint16 usBranParalState2; 	     // 第2支路并联状态      19
	quint16 usBranParalState3; 	     // 第3支路并联状态      20
	quint16 usBranParalState4; 	     // 第4支路并联状态      21
	quint16 usBranState1;            // 第1支路电池堆状态    38         
	quint16 usBranState2;            // 第2支路电池堆状态    39          
	quint16 usBranState3;            // 第3支路电池堆状态    40         
	quint16 usBranState4;            // 第4支路电池堆状态    41

	quint16 usStackStateFull;		 // 电池堆充满           44
	quint16 usStackStateEmpty;		 // 电池堆放空           45
	quint16 usStackStateTempAlarm;	 // 电池堆温度告警       46
	quint16 usStackStateCurAlarm;    // 电池堆电流告警       47
	quint16 usStackStateAllOff;		 // 电池堆接触器全断开   48
	quint16 usStackStateFault;		 // 电池堆保护(PCS故障)  49

	float fStackSoc;                 // 电池堆SOC             2
	float fStackSoh; 	             // 电池堆SOH             4
	float fStackChargeEQ; 	         // 电池堆可充电量        6
	float fStackDischargeEQ;         // 电池堆可放电量        8
	float fStackChargeEQAdd;         // 电池堆充电量累加值    10
	float fStackDischargeEQAdd; 	 // 电池堆放电量累加值    12

	float fStackTotalVol;            // 电池堆总电压         14  
	float fStackTotalCur; 	         // 电池堆总电流         16

	float fBranSoc1; 	             // 第1支路电池SOC       22
	float fBranSoc2; 	             // 第2支路电池SOC       24
	float fBranSoc3; 	             // 第3支路电池SOC       26
	float fBranSoc4; 	             // 第4支路电池SOC       28
	float fBranCur1; 	             // 第1支路当前电流      30
	float fBranCur2; 	             // 第2支路当前电流      32
	float fBranCur3; 	             // 第3支路当前电流      34
	float fBranCur4; 	             // 第4支路当前电流      36

	float fSglTempCompVol;			 // 单体电池温度补偿电压 42	
}LINUX_PACK_1_BYTE SNetBattStack;

typedef struct _SNetBattBankAlarm
{
	char aSglVolUpLimitAlarm;		 // 单体电压过高告警       1
	char aSglVolDownLimitAlarm;		 // 单体电压过低告警       2	
	char aSglTempUpLimitAlarm;		 // 单体温度过高告警	   3
	char aSglTempDownLimitAlarm;	 // 单体温度过低告警	   4
	char aSglVolUpLimitProt;		 // 单体电压过高保护	   5
	char aSglVolDownLimitProt;		 // 单体电压过低保护	   6	
	char aSglTempUpLimitProt;		 // 单体温度过高保护	   7
	char aSglTempDownLimitProt;		 // 单体温度过低保护	   8	
	char aBankVolUpLimitAlarm;	     // 组电压过高告警         9
	char aBankVolDownLimitAlarm;     // 组电压过低告警         10
	char aBankCurUpLimitAlarm;		 // 组电流过高告警         11
	char aEnvTempUpLimitAlarm;		 // 环境温度过高告警	   12
	char aEnvTempDownLimitAlarm;	 // 环境温度过低告警	   13
	char aBankSocDownLimitAlarm;	 // SOC超下限告警		   14	
	char aBankVolUpLimitProt;		 // 组电压过高保护	       15
	char aBankVolDownLimitProt;		 // 组电压过低保护	       16	
	char aBankCurUpLimitProt;		 // 组电流过高保护		   17
	char aEnvTempUpLimitProt;		 // 环境温度过高保护	   18
	char aEnvTempDownLimitProt;		 // 环境温度过低保护	   19	
	char aBankSocDownLimitProt;		 // SOC超下限保护		   20
	char aBMUConnFaultAlarm;		 // BMU设备连接故障告警	   21
	char aBCMUConnFaultAlarm;		 // BCMU设备连接故障告警   22	
	char aSglVolUpLimitWarn;	     // 单体电压过高预警	   23
	char aSglVolDownLimitWarn;	     // 单体电压过低预警	   24	
	char aSglTempUpLimitWarn;	     // 单体温度过高预警	   25	
	char aSglTempDownLimitWarn;	     // 单体温度过低预警       26
	char aBankSocUpLimitAlarm;	     // SOC超上限告警		   27
	char aBankSocUpLimitProt;		 // SOC超上限保护		   28
	char aPosResDwonLimitProt;		 // 正极绝缘内阻下限保护   29
	char aNegResDwonLimitProt;		 // 负极绝缘内阻下限保护   30
	char aPackVolDiffUpLimitAlarm;	 // 箱压差上限告警         31
	char aPackVolDiffUpLimitProt;	 // 箱压差上限保护         32
	char aPackTempDiffUpLimitAlarm;	 // 箱温差上限告警         33
	char aPackTempDiffUpLimitProt;	 // 箱温差上限保护         34	
	char aBankVolUpLimitWarn;	     // 组电压过高预警         35
	char aBankVolDownLimitWarn;      // 组电压过低预警         36
	char aBankCurUpLimitWarn;		 // 组电流过高预警         37
	char aEnvTempUpLimitWarn;		 // 环境温度过高预警	   38
	char aEnvTempDownLimitWarn;	     // 环境温度过低预警	   39
	char aBankSocUpLimitWarn;	     // SOC超上限预警		   40
	char aBankSocDownLimitWarn;	     // SOC超下限预警		   41
	char aPackVolDiffUpLimitWarn;	 // 箱压差上限预警         42
	char aPackTempDiffUpLimitWarn;	 // 箱温差上限预警         43
	char aBkwdSglVolReptProt;        // 落后电池电压多次保护   44
	char aSglVolWireFault;           // 单体电压采集线故障     45
	char aBankVolWireFault;          // 总压采集线故障         46
	char aCurWireFault;              // 电流采集线故障         47
	char aTempWireBreak;             // 温度采集断线           48
	char aTempShortCircuit;          // 温度采集短路           49	   
	char aBMSFault;                  // BMS设备故障            50
	char aBankCurAbnormity;          // 组电流异常             51	             
	char aAlarmAvailable;            // 告警信息待获取         52
}LINUX_PACK_1_BYTE SNetBattBankAlarm;

typedef struct _SNetBattBankOther 
{
	quint16	usSglMaxVolNo;           // 单电最大电压对应ID号   5001
	quint16	usSglMinVolNo;           // 单电最小电压对应ID号   5002
	quint16	usSglMaxTempNo;          // 单电最大温度对应ID号   5003
	quint16	usSglMinTempNo;          // 单电最小温度对应ID号   5004
	quint16	usSglMaxResNo;           // 单电最大内阻对应ID号   5005
	quint16	usSglMinResNo;           // 单电最小内阻对应ID号   5006
	quint16	usSglMaxSocNo;           // 单电最大SOC对应ID号    5007
	quint16	usSglMinSocNo;           // 单电最小SOC对应ID号    5008
	quint16	usSglMaxSohNo;           // 单电最大SOH对应ID号    5009
	quint16	usSglMinSohNo;           // 单电最小SOH对应ID号    5010	

	quint16 usBankState;             // 蓄电池组充放电状态                              5011    1 - 开路 2 - 待机 3 - 充电  4 - 放电   
	quint16	usBankStatePCS; 	     // 电池组状态（告知PCS）	                        5012    0x1111充满，0x2222放空，0x5555待机，0xaaaa跳机，0xbbbb正常
	quint16	usBCMUInput1;            // BCMU开关状态寄存器Input 1（直流接触器状态）		5013    1--闭合， 0--断开
	quint16	usBCMUInput2; 	         // BCMU Input 2（熔断器1状态）                    	5014
	quint16	usBCMUInput3; 	         // BCMU Input 3（熔断器2状态）	                    5015
	quint16	usBCMUInput4; 	         // BCMU Input 4（手动空开状态）		            5016

	float fBCMUBankVol; 	         // BCMU组端电压		   4001
	float fBCMUBankCur; 	         // BCMU组电流		       4003
	float fBCMUBankTemp; 	         // BCMU环境温度		   4005
	float fBCMUPosRes; 	             // BCMU 正极绝缘电阻	   4007
	float fBCMUNegRes;               // BCMU 负极绝缘电阻	   4009

	float fSglAvgVol;                // 单体电压平均值         4011
	float fSglMaxVol;                // 单电电压最大值         4013	
	float fSglMinVol; 	             // 单电电压最小值	       4015	
	float fSglAvgTemp; 	             // 单体温度平均值         4017
	float fSglMaxTemp;               // 单电温度最大值	       4019	
	float fSglMinTemp;               // 单电温度最小值	       4021	
	float fSglAvgRes;                // 单体平均内阻	       4023
	float fSglMaxRes;                // 单体内阻最大值	       4025	
	float fSglMinRes;                // 单体内阻最小值		   4027
	float fSglAvgSoc; 	             // 单体SOC平均值          4029
	float fSglMaxSoc;                // 单体SOC最大值		   4031
	float fSglMinSoc;                // 单体SOC最小值	       4033	
	float fSglAvgSoh;                // 单体SOH平均值          4035
	float fSglMaxSoh;                // 单体SOH最大值	       4037	
	float fSglMinSoh;                // 单体SOH最小值	       4039	

	float fBankSoc;                  // 组SOC		           4041
	float fBankSoh;                  // 组SOH	               4043
	float fBankChargeEQ; 	         // 电池组可充电量         4045 
	float fBankDischargeEQ; 	     // 电池组可放电量	       4047	
	float fBankChargeEQAdd; 	     // 电池组累计充电电量	   4049
	float fBankDischargeEQAdd;       // 电池组累计放电电量	   4051
	float fBankSglChargeEQAdd;     	 // 电池组单次累计充电电量 4053
	float fBankSglDischargeEQAdd; 	 // 电池组单次累计放电电量 4055 
}LINUX_PACK_1_BYTE SNetBattBankSglOther;

#ifdef XNWIN
#pragma pack(pop)                  // 恢复对齐状态
#endif

#endif // GPRS_STRUCT_H